package chapter07._04_Asserts;

/**
 * @Description: 断言的学习
 *               1.什么是断言
 *               2.启用禁用
 *               3.使用断言检查参数
 *               4.使用断言提供假设文档
 * @LastDate: 2020/11/4
 */
public class AssertLearning {
    /*
    * 启用和禁用断言 有两种方式
    * 1.命令方式：在运行是加入运行参数 -ea (-enableassertions)
    * 2.API方式: setDefaultAssertionStatus(boolean) 不知道怎么用
    *           setClassAssertionStatus(ClassName, boolean)
    *           setPackageAssertionStatus(PackageName, boolean)
    *           方法是使用其他类 去管理使用了断言的类
    *           原因:如果是使用断言的类去改变自己的断言状态 是无效的
    *           因为设置默认断言状态将仅影响随后加载的类,而不影响当前正在执行的类
    * */

    public static void whatIsAssert() {
        /*
         * 在开发和测试阶段 有一种比异常更好的手段 就是断言
         * 断言可以做到测试期间启用 生产期间禁用
         * 断言有两种格式：
         * 1.assert condition;
         * 2.assert condition : expression;
         * 判断条件，如果为false,则抛出一个AssertionError异常
         * 在第2种格式中，表达式的值将会传入AssertionError构造器 转换成消息字符串
         *
         * Notes:
         * 1.expression部分的*唯一*目的是产生一个消息字符串
         * 2.AssertionError不保存表达式的值 所以以后也得不到表达式值
         *   原因：因为如果保存了，就相当于变相鼓励程序员从断言恢复程序的运行 违背断言初衷
         * 3.初衷：调试？
         * */

        int x = (int) (Math.random() * 100 + 1);

        assert x >= 50 : "Condition:x >= 50 Result:x = " + String.valueOf(x);
    }
}
